#include "data.h"

/* Struct para os cálculos paralelos de Gauss-Legendre */
typedef struct
{
    int i;          /* Número de iterações */
	int conv;       /* Flag de convergencia */
    mpf_t a[26];     
    mpf_t b[26];
	mpf_t p[26];
    mpf_t t[26];
    mpf_t pi[2];    /* Armazena dois valores de pi */
} g_legendre; 

/* Valores iniciais para o método de Gauss-Legendre */
void start_values_gl(mpf_t a, mpf_t b, mpf_t p, mpf_t t);

/* Cálculo de a */
void calc_a(mpf_t a1, mpf_t a0, mpf_t b0);

/* Cálculo de b */
void calc_b(mpf_t b1, mpf_t a0, mpf_t b0);

/* Cálculo de t */
void calc_t(mpf_t t1, mpf_t t0, mpf_t a1, mpf_t a0, mpf_t p0);

/* Cálculo de p */
void calc_p(mpf_t p1, mpf_t p0);

/* Cálculo de pi */
void calc_pi(mpf_t pi, mpf_t a, mpf_t b, mpf_t t);

/* Gauss-Legendre sequêncial */
void gauss_legendre(mpf_t pi, int *i);

/* Inicializa a estrutura paralela */
void start_struct_gl(g_legendre *gl);

/* Limpa estrutura paralela */
void clear_struct_gl(g_legendre *gl);

/* Thread para o cálculo de 'a' */
void *thread_calc_a(void *arg);

/* Thread para cálculo de b */
void *thread_calc_b(void *arg);

/* Thread para cálculo de t */
void *thread_calc_t(void *arg);

/* Thread para cálculo de p */
void *thread_calc_p(void *arg);

/* Thread para cálculo de Pi */
void *thread_calc_pi(void *arg);

/* Gauss-Legendre paralelo */
void gauss_legendre_paral(mpf_t pi, int *iter);
